/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rpt.bd.cenario;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author nulce-03
 */
public class CProcessamentoBd {

    /**
     * 
     */
    protected CGlobal fGlobal = null;
    //protected Statement fStatement = null;
    protected ResultSet fRs = null;
    protected int fEstilo = 0;
    protected EStatusOperacao fTipoQuery = EStatusOperacao.consulta;
    protected int fValorChavePrimaria = -1;
    protected int fNumOperacoes = 0;
    protected int fNumLinhas = 0;
    protected int fNumErros = 0;
    protected Vector<String> fTitulosCampos = null;
    protected Vector<String> fNomesCampos = null;
    protected Vector<Object> fRecordSet = new Vector<Object>();

    /**
     * 
     * @param aGlobal 
     */
    public CProcessamentoBd(final CGlobal aGlobal) {
        super();
        fGlobal = aGlobal;
        //fStatement = fGlobal.getStatement();
    }

    /**
     * 
     * @param aGlobal
     * @param aEstilo 
     */
    public CProcessamentoBd(final CGlobal aGlobal, int aEstilo) {
        this(aGlobal);
        fGlobal = aGlobal;
        fEstilo = aEstilo;
    }

    /**
     * 
     * @param aGlobal
     * @param aTipoQuery 
     */
    public CProcessamentoBd(final CGlobal aGlobal, EStatusOperacao aTipoQuery) {
        this(aGlobal);
        fTipoQuery = aTipoQuery;
    }

    /**
     * 
     * @param aGlobal
     * @param aEstilo
     * @param aTipoQuery 
     */
    public CProcessamentoBd(final CGlobal aGlobal, int aEstilo, EStatusOperacao aTipoQuery) {
        this(aGlobal);
        fEstilo = aEstilo;
        fTipoQuery = aTipoQuery;
    }

    public void preparar() {
    }

    public int processar() {
        //
        if (fGlobal == null) {
            return -111;
        }
        //
        preparar();
        //
        String vQuery = getQuery();
        if (vQuery != null) {
            if (fTipoQuery == EStatusOperacao.consulta) {
                try {
                    Statement s = fGlobal.getStatement();
                    if (s == null) {
                        return -222;
                    }
                    fRs = s.executeQuery(vQuery);
                    fNumOperacoes = 0;
                    fNumErros = 0;
                    fNumLinhas = 0;
                    boolean vOk = fRs.first();
                    while (vOk) {
                        fNumLinhas++;
                        vOk = fRs.next();
                    }
                    eventoAntesExecutar();
                    vOk = fRs.first();
                    while (vOk) {
                        fNumOperacoes++;
                        if (executar() == -1) {
                            fNumErros++;
                        }
                        vOk = fRs.next();
                    }
                    eventoDepoisExecutar();
                    fRs.close();
                    return 0;
                } catch (SQLException ex) {
                    fNumOperacoes = 1;
                    fNumErros = 1;
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                    fRs = null;
                    Logger.getLogger(CProcessamentoBd.class.getName()).log(Level.SEVERE, null, ex);
                    return -2;
                }
            } else {
                try {
                    fNumOperacoes = 1;
                    Statement s = fGlobal.getStatement();
                    s.executeUpdate(vQuery, Statement.RETURN_GENERATED_KEYS);
                    obterChavePrimaria();
                    fNumErros = 0;
                    return fValorChavePrimaria;
                } catch (SQLException ex) {
                    fNumErros = 1;
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                    Logger.getLogger(CProcessamentoBd.class.getName()).log(Level.SEVERE, null, ex);
                    return -3;
                }
            }
        }
        return -1;
    }

    /**
     * 
     */
    public void eventoAntesExecutar() {
    }

    /**
     * 
     */
    public void eventoDepoisExecutar() {
    }

    /**
     * 
     * @return 
     */
    public String getQuery() {
        return null;
    }

    /**
     * 
     * @return 
     */
    public int executar() {
        return -1;
    }

    /**
     * 
     * @return 
     */
    public int obterChavePrimaria() {
        int vResultado = -1;
        ResultSet rs = null;
        try {
            Statement s = fGlobal.getStatement();
            if (s == null) {
                return -111;
            }
            rs = s.getGeneratedKeys();
        } catch (SQLException ex) {
            rs = null;
        }
        if (rs != null) {
            boolean vGerou = false;
            try {
                vGerou = rs.first();
            } catch (SQLException ex) {
                vResultado = 0;
            }
            if ((rs != null) && (vGerou)) {
                try {
                    vResultado = rs.getInt(1);
                    fValorChavePrimaria = vResultado;
                } catch (SQLException ex) {
                    vResultado = 0;
                }
            }
            try {
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(CProcessamentoBd.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return vResultado;
    }

    /**
     * 
     * @return 
     */
    public int getValorChavePrimaria() {
        return fValorChavePrimaria;
    }

    /**
     * 
     * @param aNomeCampo
     * @return 
     */
    public BigDecimal getCampoFloat(final String aNomeCampo) {
        try {
            return fRs.getBigDecimal(aNomeCampo);
        } catch (SQLException ex) {
            return BigDecimal.valueOf(0);
        }
    }

    /**
     * 
     * @param aValor
     * @param aMascara
     * @return 
     */
    public String valorFormatadoStr(BigDecimal aValor, final String aMascara) {
        if (aValor == null) {
            aValor = BigDecimal.ZERO;
        }
        DecimalFormat dec = new DecimalFormat(aMascara);
        String s = aValor.toString();
        BigDecimal b = new BigDecimal(s);
        String f1 = dec.format(b);
        return f1;
//      float f2 = Float.valueOf(f1.replace(",","."))+0;
//      return Float.toString(f2); // dec.format(f2);
    }

    /**
     * 
     * @param aNomeCampo
     * @param aMascara
     * @return 
     */
    public String getCampoFloatStr(String aNomeCampo, String aMascara) {
        return valorFormatadoStr(getCampoFloat(aNomeCampo), aMascara);
    }

    /**
     * 
     * @return 
     */
    public int getNumOperacoes() {
        return fNumOperacoes;
    }

    /**
     * 
     * @return 
     */
    public int numLinhas() {
        return fNumLinhas;
    }

    /**
     * 
     * @return 
     */
    public int numErros() {
        return fNumErros;
    }

    /**
     * 
     * @return 
     */
    public Vector<String> getTitulosCampos() {
        return fTitulosCampos;
    }

    /**
     * 
     * @return 
     */
    public Vector<String> getNomesCampos() {
        return fNomesCampos;
    }

    /**
     * 
     * @return 
     */
    public Vector<Object> getRecordSet() {
        return fRecordSet;
    }
    /**
     * 
     */
}
